Welcome to pandas!

4.8 Series和DataFrame数据的替换

1、Series数据的替换

在数据清洗时,经常需要对字符串做替换处理,其目的是将不规则的字符结构统一,使其标准化,pandas中的s.str.replace()函数可以满足需求,结构如下:

s.str.replace(pat,rep,n=-1,case=None,flags,regex=None)

pat :要查找的字符串或表达式

repl :替换字符串或可调用字符串(函数)

n :要进行的替换数,默认全部替换

case :是否区别大小写

flags :re模块的标记

regex :是否设置为正则表达式模式


import pandas as pd,re

s=pd.Series([ "lily~25/98","Bob/14~94","Lucass~21~100" ])

t1=s.str.replace( "~","/" )

pat=re.compile( "[~/]" )

t2=s.str.replace(pat, "-" , regex = True ) #regex 默认为False,必须指定为True

t3=s.str.replace( "[a-zA-Z]+" , lambda m: "("+m[0]+")" , regex = True )

t4=s.str.replace( "([a-zA-Z]+)",r"【\1】" , regex = True )

print (t1)

print (t2)

print (t3)

print (t4)

返回:

0 lily/25/98
1 Bob/14/94
2 Lucass/21/100

dtype: object


0 lily-25-98
1 Bob-14-94
2 Lucass-21-100

dtype: object


0 (lily)~25/98
1 (Bob)/14~94
2 (Lucass)~21~100

dtype: object


0 【lily】~25/98
1 【Bob】/14~94
2 【Lucass】~21~100

dtype: object


2、DataFrame数据的替换1

s.str.replace()函数只能在Series中的数据执行替换,并且只能做一个查找替换,如果希望在整个DataFrame表格中替换,并且同时做多个替换,可以用df.replace()函数,结构如下:

df.replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method=’pat’)

to_replace :查找要替换的值

Value :替换与查找要匹配的值

Inplace :就地修改,就是在原始表修改

Limit :向前或表后填充最大尺寸间隔

Regex :是否支持正则表达式,或者可以直接在此参数编写正则表达式。

Method :替换方法。

s.replace()函数是针对行或行的替换,语法与上面函数相同。


import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换.xlsx" )

print (df)

print ("----------------------------")

t1=df.replace([ "李四","李四一" ], "李无四" )

t2=df.replace({

"李四":"lucas" ,

10:99

} )

print (t1)

print ("----------------------------------")

print (t2)

返回:

姓名1 销量1 姓名2 销售2
0 张三 10 李四 65
1 李四 85 小明 100
2 王二 63 李四一 10

--------------------------------------------------------

姓名1 销量1 姓名2 销售2
0 张三 10 李无四 65
1 李无四 85 小明 100
2 王二 63 李无四 10

---------------------------------------------------------


姓名1 销量1 姓名2 销售2
0 张三 99 lucas 65
1 lucas 85 小明 100
2 王二 63 李四一 99

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换.xlsx" )

print (df)

print ("----------------------------------------------------")

t=df.replace({

"姓名2" :{

"小明":"李明" ,

"李四一":"李四"

},

"销量1" :{ 10:100 }

} )

print (t)

返回:

姓名1 销量1 姓名2 销售2
0 张三 10 李四 65
1 李四 85 小明 100
2 王二 63 李四一 10

----------------------------------------------------


姓名1 销量1 姓名2 销售2
0 张三 100 李四 65
1 李四 85 李明 100
2 王二 63 李四 10

2、DataFrame数据的替换2

正则替换,就是将正则表达式应用在数据替换中,在编写正则表达式时,可以写在df.replace()函数的to_replace和regex这两个参数中

(1)单值正则替换

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换2.xlsx" )

print (df)

t1=df.replace(

regex = "(?<=\D)(\d+)" ,

value =r "-\1"

)

print (t1)

返回:

月份 语文 数学
0 8月 李四98 李四119
1 9月 王二85 王麻子136
2 10月 陈七101 小飞130

月份 语文 数学
0 8月 李四-98 李四-119
1 9月 王二-85 王麻子-136
2 10月 陈七-101 小飞-130

(2)列表正则替换

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换2.xlsx" )

print (df)

t1=df.replace(

regex =[ "^","$" ],

value =[ "[","]" ]

)

print (t1)

返回:

月份 语文 数学
0 [8月] [李四98] [李四119]
1 [9月] [王二85] [王麻子136]
2 [10月] [陈七101] [小飞130]

(3)字典正则替换

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换2.xlsx" )

print (df)

t1=df.replace(

regex ={ "^":"(" ,

"$":")" }

)

print (t1)

t2=df.replace(

to_replace={ "月份" : "^","数学":"$" },

value ={ "月份" : "<","数学":">" },

regex = True

)

print (t2)

返回:

x
月份 语文 数学
0 8月 李四98 李四119
1 9月 王二85 王麻子136
2 10月 陈七101 小飞130

月份 语文 数学
0 (8月) (李四98) (李四119)
1 (9月) (王二85) (王麻子136)
2 (10月) (陈七101) (小飞130)

月份 语文 数学
0 <8月 李四98 李四119>
1 <9月 王二85 王麻子136>
2 <10月 陈七101 小飞130>

3、替换的实例应用1

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.替换实例1.xlsx" )

print (df)

df[ "姓名" ]=df.姓名.str.replace(pat= "(\d+)" ,repl= lambda m: "-END" +"0"*(3-len(m[0]))+m[0], regex = True )

#(3-len(m[0]))为补足0的个数

#"0"*个数 表示字符为0的个数扩展

print (df)

返回:

姓名 业绩
0 张三5 45232
1 李四78 420000
2 王麻子999 188000
3 小曾3 360000

姓名 业绩
0 张三-END005 45232
1 李四-END078 420000
2 王麻子-END999 188000
3 小曾-END003 360000

4、替换的实例应用2

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换2.xlsx" )

print (df)

df.月份.replace(

to_replace = "(^\d月)" ,

value =r "0\1" ,

regex = True ,

inplace = True

)

df.iloc[:, 1 :]=df.iloc[:, 1 :].replace(

regex ={

"(?<=\D)(?=\d)":"(" ,

"$":")"

},)

print (df)

返回:

月份 语文 数学
0 8月 李四98 李四119
1 9月 王二85 王麻子136
2 10月 陈七101 小飞130

月份 语文 数学
0 08月 李四(98) 李四(119)
1 09月 王二(85) 王麻子(136)
2 10月 陈七(101) 小飞(130)